Newer
Older
Simple-Multiplayer-Unity3D / Multiplayer Project / Library / PackageCache / [email protected] / Editor / Developer / IncomingChangesNotification.cs
using UnityEngine;
using Codice.CM.Common;
using PlasticGui.WorkspaceWindow;
using PlasticGui;
using Unity.PlasticSCM.Editor.UI.StatusBar;
using PlasticGui.WorkspaceWindow.PendingChanges;
using Unity.PlasticSCM.Editor.UI;

namespace Unity.PlasticSCM.Editor.Developer
{
    internal class IncomingChangesNotification :
        StatusBar.IIncomingChangesNotification,
        CheckIncomingChanges.IUpdateIncomingChanges
    {
        internal IncomingChangesNotification(
            WorkspaceInfo wkInfo,
            IMergeViewLauncher mergeViewLauncher,
            PlasticWindow plasticWindow)
        {
            mWkInfo = wkInfo;
            mMergeViewLauncher = mergeViewLauncher;
            mPlasticWindow = plasticWindow;
        }

        internal void SetWorkspaceWindow(WorkspaceWindow workspaceWindow)
        {
            mWorkspaceWindow = workspaceWindow;
        }

        bool StatusBar.IIncomingChangesNotification.HasNotification
        {
            get { return mHasNotification; }
        }

        void StatusBar.IIncomingChangesNotification.OnGUI()
        {
            Texture2D icon = mData.Status == PlasticNotification.Status.Conflicts ?
                Images.GetConflictedIcon() :
                Images.GetOutOfSyncIcon();

            StatusBar.DrawIcon(icon);

            StatusBar.DrawNotificationLabel(new GUIContent(mData.InfoText));

            if (StatusBar.DrawButton(new GUIContent(mData.ActionText, mData.TooltipText)))
            {
                if (mData.HasUpdateAction)
                {
                    mWorkspaceWindow.UpdateWorkspace();
                    return;
                }

                ShowIncomingChanges.FromNotificationBar(mWkInfo, mMergeViewLauncher);
            }
        }

        void CheckIncomingChanges.IUpdateIncomingChanges.Hide(WorkspaceInfo wkInfo)
        {
            if (!wkInfo.Equals(mWkInfo))
                return;

            PlasticPlugin.SetNotificationStatus(
                mPlasticWindow,
                PlasticNotification.Status.None);

            mData.Clear();

            mHasNotification = false;

            mPlasticWindow.Repaint();
        }

        void CheckIncomingChanges.IUpdateIncomingChanges.Show(
            WorkspaceInfo wkInfo,
            string infoText,
            string actionText,
            string tooltipText,
            CheckIncomingChanges.Severity severity,
            CheckIncomingChanges.Action action)
        {
            if (!wkInfo.Equals(mWkInfo))
                return;

            PlasticNotification.Status status = GetStatusFromSeverity(severity);

            mData.UpdateData(
                infoText,
                actionText,
                tooltipText,
                action == CheckIncomingChanges.Action.Update,
                status);

            mHasNotification = true;

            PlasticPlugin.SetNotificationStatus(
                mPlasticWindow,
                status);

            mPlasticWindow.Repaint();
        }

        static PlasticNotification.Status GetStatusFromSeverity(
            CheckIncomingChanges.Severity severity)
        {
            if (severity == CheckIncomingChanges.Severity.Info)
                return PlasticNotification.Status.IncomingChanges;

            if (severity == CheckIncomingChanges.Severity.Warning)
                return PlasticNotification.Status.Conflicts;

            return PlasticNotification.Status.None;
        }

        bool mHasNotification;
        StatusBar.IncomingChangesNotificationData mData =
            new StatusBar.IncomingChangesNotificationData();
        WorkspaceWindow mWorkspaceWindow;

        readonly WorkspaceInfo mWkInfo;
        readonly IMergeViewLauncher mMergeViewLauncher;
        readonly PlasticWindow mPlasticWindow;
    }
}